筆記目錄

Skip to content

在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題

TLDR

  • dotnet publish 不支援 ResolveComReference,建議將 Excel 轉檔功能獨立為 .NET Framework Web API 服務。
  • 遇到 0x80070005 存取被拒錯誤,需透過 dcomcnfg 設定 DCOM 權限,授予 IIS 應用程式集區帳戶存取權。
  • 若發生找不到 Excel 檔案的錯誤,需在系統路徑下手動建立 Desktop 資料夾以供 COM 元件存取。
  • 此方案僅限 Windows 環境,且伺服器必須安裝 Microsoft Office。

dotnet publish 編譯異常

什麼情況下會遇到這個問題:在 .NET Core 或 .NET 5+ 專案中使用 dotnet publish 指令編譯包含 COM 元件參考的程式碼時。

由於 dotnet publish 使用的是 .NET SDK 內建的 MSBuild,其並不支援 ResolveComReference 工作,導致編譯失敗並出現錯誤訊息:error MSB4803: MSBuild 的 .NET Core 版本不支援工作 "ResolveComReference"。請使用 MSBuild 的 .NET Framework 版本。

  • 解決建議:將 Excel 轉檔邏輯抽離,建立一個獨立的 .NET Framework Web API 專案來處理轉換工作,主程式再透過呼叫該 API 進行處理。

執行時的錯誤處理流程

1. DCOM 元件權限不足

什麼情況下會遇到這個問題:當 IIS 應用程式嘗試啟動 Excel COM 物件,但應用程式集區帳戶缺乏足夠的 DCOM 存取權限時。

若出現 System.UnauthorizedAccessException: Retrieving the COM class factory... 80070005 存取被拒,請依下列步驟進行設定:

  • 開啟 DCOM 設定工具:按下 Windows + R,輸入 dcomcnfg
  • 導覽至:元件服務 > 電腦 > 我的電腦 > DCOM 設定。
  • 找到 "Microsoft Excel Application",按右鍵選擇「內容」。
  • 切換至「安全性」頁籤,在「存取權限」區塊點選「自訂」。
  • 將對應的 IIS APPPOOL\{應用程式集區名稱} 加入使用者清單。
  • 勾選「本機存取」與「遠端存取」權限。

2. Excel 檔案存取問題

什麼情況下會遇到這個問題:在 Windows Server 環境中,Excel COM 元件啟動時會嘗試存取系統帳戶的 Desktop 資料夾,但該資料夾預設不存在。

若程式執行時回報找不到 Excel 相關檔案,請根據安裝的 Office 位元數,在對應路徑手動建立 Desktop 資料夾:

  • 32 位元 Office:C:\Windows\SysWOW64\config\systemprofile\Desktop
  • 64 位元 Office:C:\Windows\System32\config\systemprofile\Desktop

注意事項

  • 此設定僅適用於 Windows 環境。
  • 伺服器必須安裝 Microsoft Office 軟體。
  • 每次 Windows 更新後,建議重新檢查上述權限與資料夾設定。

異動歷程

  • 2024-10-21 初版文件建立。